package Jwtc

import (
	"github.com/golang-jwt/jwt/v5"
	// "log"
	"time"
)

type ClaimsData struct {
	Username             string `json:"username"`
	jwt.RegisteredClaims        // v5版本新加的方法
}

var secretKey string = "f95835b55b3cbf05a4368e7bccbb8a46"

// 生成JWT
func GenerateJWT(username, secretKey string) (string, error) {
	// token 过期时间24小时
	exp_at := 24 * time.Hour
	// log.Println(exp_at)
	// log.Printf("%T", exp_at)
	claims := ClaimsData{
		username,
		jwt.RegisteredClaims{
			// ExpiresAt: jwt.NewNumericDate(time.Now().Add(24 * time.Hour)), // 过期时间24小时
			ExpiresAt: jwt.NewNumericDate(time.Now().Add(exp_at)), // 过期时间24小时
			IssuedAt:  jwt.NewNumericDate(time.Now()),             // 签发时间
			NotBefore: jwt.NewNumericDate(time.Now()),             // 生效时间
			Subject:   "I see you.",                               // 主题
		},
	}
	// 使用HS256签名算法
	t := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	// 使用指定的 secret 签名并获得完成的编码后的字符串token
	sign, err := t.SignedString([]byte(secretKey))

	return sign, err
}

// 解析JWT
func ParseJwt(tokenstring, secretKey string) (*ClaimsData, error) {
	t, err := jwt.ParseWithClaims(tokenstring, &ClaimsData{}, func(token *jwt.Token) (interface{}, error) {
		return []byte(secretKey), nil
	})

	if claims, ok := t.Claims.(*ClaimsData); ok && t.Valid {
		return claims, nil
	} else {
		return nil, err
	}
}

// 生成 token（生成jwt）
func Sign(username string) (string, error) {
	// 生成JWT
	sign, err := GenerateJWT(username, secretKey)
	if err != nil {
		return "", err
	}
	// log.Println("1111", sign)
	return sign, nil
}

// 验证 token（解析JWT）
func Verify(sign string) (*ClaimsData, error) {
	// aaaa := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InhpYW9kaSIsImV4cCI6MTcwMjU0MzMxOSwibmJmIjoxNzAyNDU2OTE5LCJpYXQiOjE3MDI0NTY5MTl9.xnyT3qY6mcLQhwjcWaJC77EOdswnrMm3GzHq2IFA8dA"
	// 解析JWT
	claims, err := ParseJwt(sign, secretKey)
	// log.Println("121212", claims)
	// log.Println("131313", err)
	// log.Println("3333")
	return claims, err
}
